import getPageTitle from '@/utils/get-page-title'
import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style
import router, { routesMap, constantRoutes } from './router'
import { Notification } from 'element-ui'
import { getToken } from '@/utils/auth' // get token from cookie
import store from './store'

NProgress.configure({ showSpinner: false }) // NProgress Configuration

const whileList = ['/login']
/**
 * 权限控制页面跳转
 * 1 调用API获取用户的数据
 * 2 根据用户的数据与必须的路由进行判断， 确认是否存在权限
 * 3 addRoutes 动态添加存在权限的路由
 * 4 404路由需要放在最后面
 */
router.beforeEach(async(to, from, next) => {
  // 学习目标： 开启导航守卫
  // 判断有无token， 无token去的是登录页，跳转到登录页
  // 判断有无token， 无token去的是首页，跳转到登录页
  // 判断有无token， 有token。 直接放行
  // 有token， 判断白名单， 如果是白名单，直接放行
  const token = getToken()
  NProgress.start()
  // 设置网页标题
  document.title = getPageTitle(to.meta.title)
  if (to.path === '/login') {
    next()
    return
  }
  if (!token) {
    Notification({
      type: 'warning',
      title: '警告',
      message: '请先登录',
      duration: 1400,
      position: 'top-left'
    })
    next('/login')
    return
  }
  if (whileList.indexOf(to.path) !== -1) {
    next()
    return
  }
  if (!store.getters.name) {
    await store.dispatch('user/actionsUserInfo')
    const userPermission = store.state.user.userInfo.roles.menus
    const routes = routesMap.filter((item) => userPermission.includes(item.name))
    router.addRoutes(routes.concat({ path: '*', redirect: '/404', hidden: true }))
    store.commit('user/setRoutes', constantRoutes.concat(routes))
  }
  next()
})

router.afterEach(() => {
  // finish progress bar
  NProgress.done()
})
